package com.apkcore.bl;

import java.util.HashMap;

/**
 * 前缀和
 */
public class _560和为k的数组 {

    public static void main(String[] args) {
        int[] nums = {1, 2, 3, 4, 5};
        int k = 5;
        System.out.println(new _560和为k的数组().func(nums, k));
    }

    public int func(int[] nums, int k) {
        int n = nums.length;
        HashMap<Integer, Integer> map = new HashMap<>();
        map.put(0, 1);//一个没有就是0

        int ans = 0;
        int sumi = 0;
        // 前缀和
        // sumi-sumj = k
        // 转换一下就是sumj = sumi-k
        for (int i = 0; i < n; i++) {
            sumi += nums[i]; // 累加
            int sumj = sumi - k; // 求出j的值，
            if (map.containsKey(sumj)) {
                // 如果map中有这个值，那么已经求出过这个和了
                ans += map.get(sumj);
            }
            // 把i的值放进map
            map.put(sumi, map.getOrDefault(sumi, 0) + 1);
        }
        return ans;
    }

    public int func1(int[] nums, int k) {
        int n = nums.length;
        int[] sums = new int[n + 1];
        //前缀和
        for (int i = 0; i < n; i++) {
            sums[i + 1] = sums[i] + nums[i];
        }
        int ans = 0;
        for (int i = 1; i <= n; i++) {
            for (int j = 0; j < i; j++) {
                if (sums[i] - sums[j] == k) {
                    ans++;
                }
            }
        }
        return ans;
    }
}
